package org.example.campusforum.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.campusforum.dto.ArticlePublish;
import org.example.campusforum.entity.Article;
import org.example.campusforum.entity.ArticleImage;
import org.example.campusforum.entity.ArticleLike;
import org.example.campusforum.entity.User;
import org.example.campusforum.mapper.ArticleMapper;
import org.example.campusforum.mapper.CommentMapper;
import org.example.campusforum.service.ArticleService;
import org.example.campusforum.utils.BaseContext;
import org.example.campusforum.vo.ArticleDetailsReturn;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 文章服务实现类
 *
 * 实现文章相关的业务逻辑，包括文章的发布、删除、查询详情和点赞等功能。
 * 继承ServiceImpl提供基础的CRUD操作，实现ArticleService接口。
 *
 * @author CampusForum Team
 * @version 1.0
 * @since 2024
 */
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {

    /**
     * 文章数据访问层
     */
    @Autowired
    private ArticleMapper articleMapper;

    /**
     * 评论数据访问层
     */
    @Autowired
    private CommentMapper commentMapper;

    /**
     * 发布文章
     *
     * 根据文章发布DTO创建新文章，设置当前登录用户为作者，
     * 并将文章状态设置为审核通过。
     *
     * @param articlePublish 文章发布信息，包含标题、内容、分类等
     */
    public void save(ArticlePublish articlePublish) {

        // 从ThreadLocal获取当前登录用户ID
        Long userId = BaseContext.getCurrentId();

        // 构建文章实体对象
        Article article = new Article();
        BeanUtils.copyProperties(articlePublish, article);

        // 设置文章属性
        article.setUserId(userId);  // 设置发表人ID
        article.setStatus(1);       // 设置为审核通过状态
        // 其他字段（如创建时间、点赞数等）在数据库中有默认值

        // 保存文章到数据库
        articleMapper.insert(article);
    }

    /**
     * 根据ID删除文章
     *
     * 执行逻辑删除操作，将文章标记为已删除状态，
     * 而不是物理删除数据库记录。
     *
     * @param id 文章ID
     */
    public void deleteById(Long id) {
        articleMapper.logicalDeleteById(id);
    }

    /**
     * 获取文章详情
     *
     * 查询文章的完整信息，包括文章内容、作者信息、图片列表和评论列表。
     * 同时增加文章的浏览量。采用分步查询的方式获取相关数据。
     *
     * @param id 文章ID
     * @return 文章详情信息，包含所有相关数据
     */
    @Override
    public ArticleDetailsReturn getArticleDetails(Long id) {
        // 创建返回对象
        ArticleDetailsReturn articleDetailsReturn = new ArticleDetailsReturn();

        // 查询文章基本信息
        Article article = articleMapper.getArticle(id);

        // 查询文章图片列表
        List<ArticleImage> articleImages = articleMapper.getArticleImage(id);

        // 验证数据有效性并组装返回对象
        if (article.getUserId() != null && articleImages != null) {
            // 查询文章作者信息
            User user = articleMapper.getUserMapper(article.getUserId());

            // 设置文章详情信息
            articleDetailsReturn.setArticleId(id);
            articleDetailsReturn.setNickname(user.getNickname());
            articleDetailsReturn.setAvatar(user.getAvatar());
            articleDetailsReturn.setTitle(article.getTitle());
            articleDetailsReturn.setContent(article.getContent());
            articleDetailsReturn.setLikeCount(article.getLikeCount());
            articleDetailsReturn.setViewCount(article.getViewCount());
            articleDetailsReturn.setImages(articleImages);
        }

        // 增加文章浏览量
        articleMapper.view(id);

        // 查询并设置文章评论列表（包含顶级评论和子评论）
        articleDetailsReturn.setCommentVOs(commentMapper.selectRootComments(id));

        return articleDetailsReturn;
    }

    /**
     * 文章点赞/取消点赞
     *
     * 根据当前用户的点赞状态执行相应操作：
     * - 如果已点赞，则取消点赞（删除点赞记录，减少点赞数）
     * - 如果未点赞，则添加点赞（创建点赞记录，增加点赞数）
     *
     * @param id 文章ID
     * @return 操作结果（1-操作成功）
     */
    @Override
    public int like(Long id) {
        // 获取当前登录用户ID
        Long userId = BaseContext.getCurrentId();

        // 查询用户是否已对该文章点赞
        ArticleLike articleLike = articleMapper.ifExist(userId, id);

        if (articleLike != null) {
            // 用户已点赞，执行取消点赞操作
            // 删除点赞记录
            articleMapper.delete(userId, id);
            // 减少文章点赞数
            articleMapper.unlike(id);
        } else {
            // 用户未点赞，执行点赞操作
            // 创建点赞记录
            ArticleLike articleLike1 = new ArticleLike();
            articleLike1.setArticleId(id);
            articleLike1.setUserId(userId);
            articleLike1.setCreateTime(LocalDateTime.now());

            // 保存点赞记录
            articleMapper.add(articleLike1);
            // 增加文章点赞数
            articleMapper.like(id);
        }

        return 1;
    }
}
